#include<stdlib.h>
#include<stdio.h>
//动态内存分配几个常见的问题

 //1.对NULL指针解引用的问题
 int main1(){
  int *p = (int *)malloc(INT16_MAX);
  *p = 20;
  printf("%p",p);
  printf("%d\n",*p);
  free(p);
  return 1;
 }

 //2.对动态开辟内存空间进行越界访问
 int main2(){
  int i = 0;
  int *p = malloc(10*sizeof(int));
  for ( i = 0; i <= 10; i++)
  {
    *(p+i) = i;
    printf("%d",*(p+i));
  }
  free(p);
  p=NULL;
  return 0;
 }

 //3. 对非动态内存开辟空间进行free释放
 int main3(){
  int a = 10;
  int *p = &a;
  free(p);
  return 1;
 }

 //4.使用free()释放动态开辟空间的一部分(即释放了非动态内存开辟空间的首个地址)
 int main4(){
  int *p = (int *)malloc(40);
  p++;
  free(p);
  p = NULL;
  return 0;
 }

//5.对同一块动态内存空间多次释放
int main5(){
  int* p = malloc(40);
  free(p);
  free(p);
  return 0;
}

//6.动态开辟内存空间忘记释放(内存泄漏)
void test()
{
int *p = (int *)malloc(100);
if(NULL != p)
 {
    *p = 20;
 }
}
int main()
{
  test();
  while(1);
}



